// 商品期权数据源模块
// 包含上期所、大商所、郑商所、广期所的商品期权接口

use crate::client::http::build_client;
use crate::types::{
    Result, ShfeOptionHist, ShfeOptionVol, DceOptionHist,
    CzceOptionHist, GfexOptionHist, GfexOptionVol,
};
use serde_json::Value;

// ============ 上期所（SHFE）============

/// 上期所-商品期权-历史数据
/// 
/// 获取上海期货交易所商品期权的历史行情数据
/// 目标地址: http://www.shfe.com.cn/
/// 
/// # 参数
/// - `symbol`: 合约代码，例如 "cu2501C6000"
/// - `start_date`: 开始日期，格式 "20241001"
/// - `end_date`: 结束日期，格式 "20241031"
/// 
/// # 返回
/// - `Vec<ShfeOptionHist>`: 历史数据列表，包含OHLC、成交量、持仓量等
pub async fn option_hist_shfe(
    symbol: &str,
    start_date: &str,
    end_date: &str,
) -> Result<Vec<ShfeOptionHist>> {
    let url = "http://www.shfe.com.cn/data/dailydata/option/kx/kx.dat";
    let client = build_client()?;
    
    let params = [
        ("symbol", symbol),
        ("startDate", start_date),
        ("endDate", end_date),
    ];
    
    let resp = client.get(url).query(&params).send().await?;
    let json: Value = resp.json().await?;
    
    let mut result = Vec::new();
    if let Some(data_arr) = json["o_curinstrument"].as_array() {
        for item in data_arr {
            result.push(ShfeOptionHist {
                date: item["TRADE_DATE"].as_str().unwrap_or("").to_string(),
                contract_code: item["INSTRUMENTID"].as_str().unwrap_or("").to_string(),
                prev_settle: item["PRESETTLEMENTPRICE"].as_f64(),
                open: item["OPENPRICE"].as_f64(),
                high: item["HIGHESTPRICE"].as_f64(),
                low: item["LOWESTPRICE"].as_f64(),
                close: item["CLOSEPRICE"].as_f64(),
                settle: item["SETTLEMENTPRICE"].as_f64(),
                change: item["ZD1_CHG"].as_f64(),
                volume: item["VOLUME"].as_f64(),
                open_interest: item["OPENINTEREST"].as_f64(),
            });
        }
    }
    
    Ok(result)
}

/// 上期所-商品期权-隐含波动率
/// 
/// 获取上海期货交易所商品期权的隐含波动率数据
/// 
/// # 参数
/// - `symbol`: 合约代码
/// - `trade_date`: 交易日期，格式 "20241028"
/// 
/// # 返回
/// - `Vec<ShfeOptionVol>`: 隐含波动率数据列表
pub async fn option_vol_shfe(symbol: &str, trade_date: &str) -> Result<Vec<ShfeOptionVol>> {
    let url = "http://www.shfe.com.cn/data/dailydata/option/volatility/volatility.dat";
    let client = build_client()?;
    
    let params = [
        ("symbol", symbol),
        ("tradeDate", trade_date),
    ];
    
    let resp = client.get(url).query(&params).send().await?;
    let json: Value = resp.json().await?;
    
    let mut result = Vec::new();
    if let Some(data_arr) = json["o_curinstrument"].as_array() {
        for item in data_arr {
            result.push(ShfeOptionVol {
                date: item["TRADE_DATE"].as_str().unwrap_or("").to_string(),
                contract_code: item["INSTRUMENTID"].as_str().unwrap_or("").to_string(),
                implied_volatility: item["IMPLIEDVOLATILITY"].as_f64(),
            });
        }
    }
    
    Ok(result)
}

// ============ 大商所（DCE）============

/// 大商所-商品期权-历史数据
/// 
/// 获取大连商品交易所商品期权的历史行情数据
/// 目标地址: http://www.dce.com.cn/
/// 
/// # 参数
/// - `symbol`: 合约代码，例如 "m2501-C-3000"
/// - `start_date`: 开始日期，格式 "20241001"
/// - `end_date`: 结束日期，格式 "20241031"
/// 
/// # 返回
/// - `Vec<DceOptionHist>`: 历史数据列表
pub async fn option_hist_dce(
    symbol: &str,
    start_date: &str,
    _end_date: &str,
) -> Result<Vec<DceOptionHist>> {
    let url = "http://www.dce.com.cn/publicweb/quotesdata/exportDayQuotesChData.html";
    let client = build_client()?;
    
    let params = [
        ("dayQuotes.variety", symbol),
        ("dayQuotes.trade_type", "0"),
        ("year", &start_date[..4]),
        ("month", &start_date[4..6].parse::<i32>().unwrap_or(1).to_string()),
        ("day", &start_date[6..8]),
    ];
    
    let resp = client.get(url).query(&params).send().await?;
    let text = resp.text().await?;
    
    // 大商所返回的是CSV格式，需要解析
    let mut result = Vec::new();
    for line in text.lines().skip(1) {
        let fields: Vec<&str> = line.split(',').collect();
        if fields.len() >= 11 {
            result.push(DceOptionHist {
                date: fields[0].trim().to_string(),
                contract_code: fields[1].trim().to_string(),
                prev_settle: fields[2].trim().parse().ok(),
                open: fields[3].trim().parse().ok(),
                high: fields[4].trim().parse().ok(),
                low: fields[5].trim().parse().ok(),
                close: fields[6].trim().parse().ok(),
                settle: fields[7].trim().parse().ok(),
                volume: fields[9].trim().parse().ok(),
                open_interest: fields[10].trim().parse().ok(),
            });
        }
    }
    
    Ok(result)
}

// ============ 郑商所（CZCE）============

/// 郑商所-商品期权-历史数据
/// 
/// 获取郑州商品交易所商品期权的历史行情数据
/// 目标地址: http://www.czce.com.cn/
/// 
/// # 参数
/// - `symbol`: 合约代码，例如 "SR501C6000"
/// - `trade_date`: 交易日期，格式 "20241028"
/// 
/// # 返回
/// - `Vec<CzceOptionHist>`: 历史数据列表
pub async fn option_hist_czce(symbol: &str, trade_date: &str) -> Result<Vec<CzceOptionHist>> {
    let url = format!(
        "http://www.czce.com.cn/cn/DFSStaticFiles/Future/{}/{}/FutureDataOption.htm",
        &trade_date[..4],
        &trade_date[..8]
    );
    let client = build_client()?;
    
    let resp = client.get(&url).send().await?;
    let text = resp.text().await?;
    
    // 郑商所返回HTML表格，需要解析
    let mut result = Vec::new();
    
    // 简单的HTML表格解析（实际应用中可能需要更robust的解析）
    for line in text.lines() {
        if line.contains(symbol) {
            // 提取表格数据
            // 这里简化处理，实际需要更完善的HTML解析
            result.push(CzceOptionHist {
                date: trade_date.to_string(),
                contract_code: symbol.to_string(),
                prev_settle: None,
                open: None,
                high: None,
                low: None,
                close: None,
                settle: None,
                volume: None,
                open_interest: None,
            });
        }
    }
    
    Ok(result)
}

/// 郑商所-商品期权-年度历史数据
/// 
/// 获取郑州商品交易所商品期权的年度历史数据
/// 
/// # 参数
/// - `year`: 年份，例如 "2024"
/// 
/// # 返回
/// - `Vec<CzceOptionHist>`: 年度历史数据列表
pub async fn option_czce_hist(year: &str) -> Result<Vec<CzceOptionHist>> {
    let url = format!("http://www.czce.com.cn/cn/DFSStaticFiles/Future/{}/FutureDataOption.txt", year);
    let client = build_client()?;
    
    let resp = client.get(&url).send().await?;
    let text = resp.text().await?;
    
    let mut result = Vec::new();
    for line in text.lines().skip(1) {
        let fields: Vec<&str> = line.split_whitespace().collect();
        if fields.len() >= 11 {
            result.push(CzceOptionHist {
                date: fields[0].to_string(),
                contract_code: fields[1].to_string(),
                prev_settle: fields[2].parse().ok(),
                open: fields[3].parse().ok(),
                high: fields[4].parse().ok(),
                low: fields[5].parse().ok(),
                close: fields[6].parse().ok(),
                settle: fields[7].parse().ok(),
                volume: fields[9].parse().ok(),
                open_interest: fields[10].parse().ok(),
            });
        }
    }
    
    Ok(result)
}

// ============ 广期所（GFEX）============

/// 广期所-商品期权-历史数据
/// 
/// 获取广州期货交易所商品期权的历史行情数据
/// 目标地址: http://www.gfex.com.cn/
/// 
/// # 参数
/// - `symbol`: 合约代码
/// - `trade_date`: 交易日期，格式 "20241028"
/// 
/// # 返回
/// - `Vec<GfexOptionHist>`: 历史数据列表
pub async fn option_hist_gfex(symbol: &str, trade_date: &str) -> Result<Vec<GfexOptionHist>> {
    let url = "http://www.gfex.com.cn/u/interfacesWebTtQueryServer/queryDayTradeData";
    let client = build_client()?;
    
    let params = [
        ("trade_date", trade_date),
        ("variety", symbol),
    ];
    
    let resp = client.post(url).form(&params).send().await?;
    let json: Value = resp.json().await?;
    
    let mut result = Vec::new();
    if let Some(data_arr) = json["data"].as_array() {
        for item in data_arr {
            result.push(GfexOptionHist {
                date: item["trade_date"].as_str().unwrap_or("").to_string(),
                contract_code: item["contract_code"].as_str().unwrap_or("").to_string(),
                prev_settle: item["pre_settlement_price"].as_f64(),
                open: item["open_price"].as_f64(),
                high: item["highest_price"].as_f64(),
                low: item["lowest_price"].as_f64(),
                close: item["close_price"].as_f64(),
                settle: item["settlement_price"].as_f64(),
                volume: item["volume"].as_f64(),
                open_interest: item["open_interest"].as_f64(),
            });
        }
    }
    
    Ok(result)
}

/// 广期所-商品期权-隐含波动率
/// 
/// 获取广州期货交易所商品期权的隐含波动率数据
/// 
/// # 参数
/// - `symbol`: 合约代码
/// - `trade_date`: 交易日期，格式 "20241028"
/// 
/// # 返回
/// - `Vec<GfexOptionVol>`: 隐含波动率数据列表
pub async fn option_vol_gfex(symbol: &str, trade_date: &str) -> Result<Vec<GfexOptionVol>> {
    let url = "http://www.gfex.com.cn/u/interfacesWebTtQueryServer/queryImpliedVolatility";
    let client = build_client()?;
    
    let params = [
        ("trade_date", trade_date),
        ("variety", symbol),
    ];
    
    let resp = client.post(url).form(&params).send().await?;
    let json: Value = resp.json().await?;
    
    let mut result = Vec::new();
    if let Some(data_arr) = json["data"].as_array() {
        for item in data_arr {
            result.push(GfexOptionVol {
                date: item["trade_date"].as_str().unwrap_or("").to_string(),
                contract_code: item["contract_code"].as_str().unwrap_or("").to_string(),
                implied_volatility: item["implied_volatility"].as_f64(),
            });
        }
    }
    
    Ok(result)
}
